from django.db import models

# # Create your models here.
# ## 自己定义模型
# ## 密码要加密，还要实现登录时的验证
# class User(models.Model):
#   username=models.CharField(max_length=20, unique=True)
#   password=models.CharField(max_length=20)
#   mobile=models.CharField(max_length=11, unique=True)

## django自带一个用户模型，实现了密码的加密和验证
# from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser

# 从自定义工具模块导入基础模型类
from utils.models import BaseModel

class User(AbstractUser):
    """
    自定义用户模型类，继承自 AbstractUser。
    扩展了 Django 自带的用户模型，添加了手机号和邮箱验证状态等字段。
    """
    # 手机号码字段，长度为 11 位，要求唯一
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
    # 邮箱验证状态字段，默认值为 False 表示未验证
    email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态')
    # 定义一个外键关联到 Address 模型，用于存储用户的默认地址
    # 当关联的地址记录被删除时，将该字段的值设置为 NULL
    # related_name='users' 允许通过 Address 实例反向访问关联的用户
    default_address = models.ForeignKey('Address', related_name='users', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='默认地址')

    class Meta:
        # 数据库表名
        db_table = 'tb_users'
        # 模型的单数显示名称
        verbose_name = '用户'
        # 模型的复数显示名称
        verbose_name_plural = verbose_name

    def __str__(self):
        """
        返回用户的用户名，用于在管理界面等地方显示用户信息。
        """
        return self.username

### 我们给自己的用户模型类起名为 user,系统也有一个模型叫 user,冲突了，所以我们要替换一下系统的

class Address(BaseModel):
    """
    用户地址模型类，继承自 BaseModel。
    用于存储用户的收货地址相关信息。
    """
    # 定义一个外键字段，关联到 User 模型，当关联的用户被删除时，该地址记录也会被级联删除
    # related_name='addresses' 允许通过 User 实例反向访问其所有地址记录
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户')
    # 地址名称字段，用于用户自定义该地址的名称
    title = models.CharField(max_length=20, verbose_name='地址名称')
    # 收货人姓名字段
    receiver = models.CharField(max_length=20, verbose_name='收货人')
    # 省份字段，关联到 areas 应用中的 Area 模型，保护关联数据不被意外删除
    province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')
    # 城市字段，关联到 areas 应用中的 Area 模型，保护关联数据不被意外删除
    city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')
    # 区/县字段，关联到 areas 应用中的 Area 模型，保护关联数据不被意外删除
    district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')
    # 详细地址字段
    place = models.CharField(max_length=50, verbose_name='地址')
    # 收货人手机号码字段
    mobile = models.CharField(max_length=11, verbose_name='手机')
    # 收货人固定电话字段，允许为空
    tel = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='固定电话')
    # 收货人电子邮箱字段，允许为空
    email = models.CharField(max_length=30, null=True, blank=True, default='', verbose_name='电子邮箱')
    # 逻辑删除字段，默认值为 False 表示未删除
    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        # 数据库表名
        db_table = 'tb_address'
        # 模型的单数显示名称
        verbose_name = '用户地址'
        # 模型的复数显示名称
        verbose_name_plural = verbose_name
        # 按更新时间倒序排序
        ordering = ['-update_time']